// 中间件
const jwt = require('jsonwebtoken')
const {User} = require('../models')
const {UnauthorizedError} = require('../utils/errors')
const {success,failure} = require('../utils/response')

module.exports = async (req,res,next) => {
    try {
        // 一般token存在请求头中
        // 最主要的原因还是head和body是分开传输的，当body非常大时，
        //后端可以先解析head中的身份认证参数，当认证失败时，可以不再传输body，达到快速响应以及节省流量
        const {token} = req.headers
        if(!token){
            throw new UnauthorizedError('当前接口需要认证才能访问')
        }
        // 验证token值是否正确
        const decoded = jwt.verify(token,process.env.SECRET)
        // 生成token时userId放入了用户的id属性，这里是从jwt中解析出来
        const {userId} = decoded
        const user = await User.findByPk(userId)
        if(!user){
            throw new UnauthorizedError('用户不存在')
        }
        if(user.role != 100){
            throw new UnauthorizedError('您不是管理员，无资格使用此接口')
        }
        // 将登录的用户信息挂载到req上，方便后续路由使用，比如创建课程时的用户信息应该是这个用户信息
        req.user = user 
        next()
    } catch (error) {
        failure(res,error)
    }
}